home *** CD-ROM | disk | FTP | other *** search
- #include <Fonts.h>
- #include <Resources.h>
- #include <QuickDraw.h>
- #include <Menus.h>
- #include <Memory.h>
-
- #include "access.h"
-
- typedef struct {
- short familyIndex;
- short styleIndex;
- short fondID;
- short faceID;
- Handle sfnt;
- } fontElement;
-
- typedef struct {
- short fontCount;
- short familyCount;
- /* fontRecord[fontCount] */
- } fontListHead, **fontList;
-
- #define fontListDefined
- #include "access menu.h"
-
- #define NO_FAMILY -1
-
- static int PCompare(unsigned char* a, unsigned char* b)
- {
- short size_a = *a++;
- short size_b = *b++;
- short size = size_a < size_b ? size_a : size_b;
-
- for (--size; size >= 0; --size)
- if (*a++ != *b++)
- return a[-1] - b[-1];
- return size_a - size_b;
- }
-
- static fontList NewFontList(void)
- {
- fontList list = (fontList)NewHandle(sizeof(fontListHead));
- if (!list || MemError())
- { Debugger();
- return 0;
- }
- (**list).fontCount = (**list).familyCount = 0;
- return list;
- }
-
- static void AddToFontList(fontList list, short fondID, short faceID, Handle sfnt)
- {
- fontElement* elem;
-
- SetHandleSize((Handle)list, sizeof(fontListHead) + ((**list).fontCount+1) * sizeof(fontElement));
- if (MemError())
- Debugger();
-
- elem = (fontElement*)(*list + 1) + (**list).fontCount++;
-
- elem->familyIndex = NO_FAMILY;
- elem->fondID = fondID;
- elem->faceID = faceID;
- elem->sfnt = sfnt;
- }
-
- static int lowercase(int c)
- {
- if (c >= 'A' && c <= 'Z')
- return c - 'A' + 'a';
- return c;
- }
-
- static int FirstIsBigger(unsigned char* a, unsigned char* b)
- {
- int count_a = *a++;
- int count_b = *b++;
- int count = count_a < count_b ? count_a : count_b;
-
- for (--count; count >= 0; --count)
- if (lowercase(*a++) > lowercase(*b++))
- return true;
- return count_a > count_b;
- }
-
- static void MakeFontFamilies(fontList list)
- {
- HLock((Handle)list);
- { fontListHead* head = *list;
- fontElement* elem = (fontElement*)(head + 1);
- fontElement* stop = elem + head->fontCount;
-
- for (; elem < stop; elem++)
- { Str255 familyName;
- short styleIndex;
-
- if (elem->familyIndex != NO_FAMILY)
- continue;
-
- elem->familyIndex = head->familyCount++;
- elem->styleIndex = styleIndex = 0;
- if (!GetSfntNameString(elem->sfnt, name_Family, familyName))
- { fontElement* tmp = elem + 1;
- for (; tmp < stop; tmp++)
- if (tmp->familyIndex == NO_FAMILY)
- { Str255 name;
- GetSfntNameString(tmp->sfnt, name_Family, name);
- if (PCompare(familyName, name) == 0)
- { tmp->familyIndex = elem->familyIndex;
- tmp->styleIndex = ++styleIndex;
- }
- }
- }
- else
- Debugger();
- }
- }
- HUnlock((Handle)list);
- }
-
- fontList BuildFontList(void)
- {
- short i, fonds = CountResources('FOND');
- fontList list = NewFontList();
-
- for (i = 1; i <= fonds; i++)
- { Handle fond = GetIndResource('FOND', i);
-
- if (fond && !ResError())
- { FamRec* frec = (FamRec*)*fond;
- short* assoc = (short*)(frec + 1);
- short count = *assoc++;
- short fondID;
-
- HLock(fond);
- { ResType rType;
- Str255 name;
- GetResInfo(fond, &fondID, &rType, name);
- }
- while (count-- >= 0 && *assoc++ == 0)
- { short faceID = *assoc++;
- short sfntID = *assoc++;
- Handle sfnt = GetResource('sfnt', sfntID);
-
- if (sfnt && !ResError())
- AddToFontList(list, fondID, faceID, sfnt);
- }
- HUnlock(fond);
- }
- }
- MakeFontFamilies(list);
- return list;
- }
-
- short CountFontFamilies(fontList list)
- {
- return (**list).familyCount;
- }
-
- short CountFontStyles(fontList list, short familyIndex)
- {
- familyIndex--;
- if (familyIndex < 0 || familyIndex >= (**list).familyCount)
- { Debugger();
- return 0;
- }
- else
- { short count = 0;
- fontElement* elem = (fontElement*)(*list + 1);
- fontElement* stop = elem + (**list).fontCount;
- for (; elem < stop; elem++)
- if (elem->familyIndex == familyIndex)
- count++;
- return count;
- }
- }
-
- Handle GetFontStyle(fontList list, short familyIndex, short styleIndex)
- {
- familyIndex--;
- styleIndex--;
- if (familyIndex < 0 || familyIndex >= (**list).familyCount)
- { Debugger();
- return 0;
- }
- else
- { fontElement* elem = (fontElement*)(*list + 1);
- fontElement* stop = elem + (**list).fontCount;
- for (; elem < stop; elem++)
- if (elem->familyIndex == familyIndex && elem->styleIndex == styleIndex)
- return elem->sfnt;
- Debugger();
- return 0;
- }
- }
-
- short GetFontFace(fontList list, short familyIndex, short styleIndex)
- {
- familyIndex--;
- styleIndex--;
- if (familyIndex < 0 || familyIndex >= (**list).familyCount)
- { Debugger();
- return 0;
- }
- else
- { fontElement* elem = (fontElement*)(*list + 1);
- fontElement* stop = elem + (**list).fontCount;
- for (; elem < stop; elem++)
- if (elem->familyIndex == familyIndex && elem->styleIndex == styleIndex)
- return elem->faceID;
- Debugger();
- return 0;
- }
- }
-
- short GetFontFond(fontList list, short familyIndex, short styleIndex)
- {
- familyIndex--;
- styleIndex--;
- if (familyIndex < 0 || familyIndex >= (**list).familyCount)
- { Debugger();
- return 0;
- }
- else
- { fontElement* elem = (fontElement*)(*list + 1);
- fontElement* stop = elem + (**list).fontCount;
- for (; elem < stop; elem++)
- if (elem->familyIndex == familyIndex && elem->styleIndex == styleIndex)
- return elem->fondID;
- Debugger();
- return 0;
- }
- }
-
- short FindFamilyIndex(fontList list, Str255 familyName)
- {
- fontElement* elem = (fontElement*)(*list + 1);
- fontElement* stop = elem + (**list).fontCount;
- for (; elem < stop; elem++)
- { Str255 name;
- GetSfntNameString(elem->sfnt, name_Family, name);
- if (PCompare(name, familyName) == 0)
- return elem->familyIndex + 1;
- }
- Debugger();
- return 0;
- }
-
- void SortMenu(MenuHandle menu)
- {
- short i, j, count = CountMItems(menu);
-
- for (i = 2; i <= count; i++)
- for (j = count; j >= i; --j) {
- Str255 lower, upper;
- GetItem(menu, j, lower);
- GetItem(menu, j-1, upper);
- if (PCompare(lower, upper) < 0) {
- SetItem(menu, j, upper);
- SetItem(menu, j-1, lower);
- }
- }
- }
-
-